home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / gcc-lib / i686-pc-linux-gnu / 3.3.6 / include / emmintrin.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  35KB  |  1,500 lines

  1. /* Copyright (C) 2003 Free Software Foundation, Inc.
  2.  
  3.    This file is part of GNU CC.
  4.  
  5.    GNU CC is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.  
  10.    GNU CC is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.
  14.  
  15.    You should have received a copy of the GNU General Public License
  16.    along with GNU CC; see the file COPYING.  If not, write to
  17.    the Free Software Foundation, 59 Temple Place - Suite 330,
  18.    Boston, MA 02111-1307, USA.  */
  19.  
  20. /* As a special exception, if you include this header file into source
  21.    files compiled by GCC, this header file does not by itself cause
  22.    the resulting executable to be covered by the GNU General Public
  23.    License.  This exception does not however invalidate any other
  24.    reasons why the executable file might be covered by the GNU General
  25.    Public License.  */
  26.  
  27. /* Implemented from the specification included in the Intel C++ Compiler
  28.    User Guide and Reference, version 8.0.  */
  29.  
  30. #ifndef _EMMINTRIN_H_INCLUDED
  31. #define _EMMINTRIN_H_INCLUDED
  32.  
  33. #ifdef __SSE2__
  34. #include <xmmintrin.h>
  35.  
  36. /* SSE2 */
  37. typedef int __v2df __attribute__ ((mode (V2DF)));
  38. typedef int __v2di __attribute__ ((mode (V2DI)));
  39. typedef int __v4si __attribute__ ((mode (V4SI)));
  40. typedef int __v8hi __attribute__ ((mode (V8HI)));
  41. typedef int __v16qi __attribute__ ((mode (V16QI)));
  42.  
  43. /* Create a selector for use with the SHUFPD instruction.  */
  44. #define _MM_SHUFFLE2(fp1,fp0) \
  45.  (((fp1) << 1) | (fp0))
  46.  
  47. #define __m128i __v2di
  48. #define __m128d __v2df
  49.  
  50. /* Create a vector with element 0 as *P and the rest zero.  */
  51. static __inline __m128d
  52. _mm_load_sd (double const *__P)
  53. {
  54.   return (__m128d) __builtin_ia32_loadsd (__P);
  55. }
  56.  
  57. /* Create a vector with all two elements equal to *P.  */
  58. static __inline __m128d
  59. _mm_load1_pd (double const *__P)
  60. {
  61.   __v2df __tmp = __builtin_ia32_loadsd (__P);
  62.   return (__m128d) __builtin_ia32_shufpd (__tmp, __tmp, _MM_SHUFFLE2 (0,0));
  63. }
  64.  
  65. static __inline __m128d
  66. _mm_load_pd1 (double const *__P)
  67. {
  68.   return _mm_load1_pd (__P);
  69. }
  70.  
  71. /* Load two DPFP values from P.  The address must be 16-byte aligned.  */
  72. static __inline __m128d
  73. _mm_load_pd (double const *__P)
  74. {
  75.   return (__m128d) __builtin_ia32_loadapd (__P);
  76. }
  77.  
  78. /* Load two DPFP values from P.  The address need not be 16-byte aligned.  */
  79. static __inline __m128d
  80. _mm_loadu_pd (double const *__P)
  81. {
  82.   return (__m128d) __builtin_ia32_loadupd (__P);
  83. }
  84.  
  85. /* Load two DPFP values in reverse order.  The address must be aligned.  */
  86. static __inline __m128d
  87. _mm_loadr_pd (double const *__P)
  88. {
  89.   __v2df __tmp = __builtin_ia32_loadapd (__P);
  90.   return (__m128d) __builtin_ia32_shufpd (__tmp, __tmp, _MM_SHUFFLE2 (0,1));
  91. }
  92.  
  93. /* Create a vector with element 0 as F and the rest zero.  */
  94. static __inline __m128d
  95. _mm_set_sd (double __F)
  96. {
  97.   return (__m128d) __builtin_ia32_loadsd (&__F);
  98. }
  99.  
  100. /* Create a vector with all two elements equal to F.  */
  101. static __inline __m128d
  102. _mm_set1_pd (double __F)
  103. {
  104.   __v2df __tmp = __builtin_ia32_loadsd (&__F);
  105.   return (__m128d) __builtin_ia32_shufpd (__tmp, __tmp, _MM_SHUFFLE2 (0,0));
  106. }
  107.  
  108. static __inline __m128d
  109. _mm_set_pd1 (double __F)
  110. {
  111.   return _mm_set1_pd (__F);
  112. }
  113.  
  114. /* Create the vector [Z Y].  */
  115. static __inline __m128d
  116. _mm_set_pd (double __Z, double __Y)
  117. {
  118.   union {
  119.     double __a[2];
  120.     __m128d __v;
  121.   } __u;
  122.  
  123.   __u.__a[0] = __Y;
  124.   __u.__a[1] = __Z;
  125.  
  126.   return __u.__v;
  127. }
  128.  
  129. /* Create the vector [Y Z].  */
  130. static __inline __m128d
  131. _mm_setr_pd (double __Z, double __Y)
  132. {
  133.   return _mm_set_pd (__Y, __Z);
  134. }
  135.  
  136. /* Create a vector of zeros.  */
  137. static __inline __m128d
  138. _mm_setzero_pd (void)
  139. {
  140.   return (__m128d) __builtin_ia32_setzeropd ();
  141. }
  142.  
  143. /* Stores the lower DPFP value.  */
  144. static __inline void
  145. _mm_store_sd (double *__P, __m128d __A)
  146. {
  147.   __builtin_ia32_storesd (__P, (__v2df)__A);
  148. }
  149.  
  150. /* Store the lower DPFP value acrosd two words.  */
  151. static __inline void
  152. _mm_store1_pd (double *__P, __m128d __A)
  153. {
  154.   __v2df __va = (__v2df)__A;
  155.   __v2df __tmp = __builtin_ia32_shufpd (__va, __va, _MM_SHUFFLE2 (0,0));
  156.   __builtin_ia32_storeapd (__P, __tmp);
  157. }
  158.  
  159. static __inline void
  160. _mm_store_pd1 (double *__P, __m128d __A)
  161. {
  162.   _mm_store1_pd (__P, __A);
  163. }
  164.  
  165. /* Store two DPFP values.  The address must be 16-byte aligned.  */
  166. static __inline void
  167. _mm_store_pd (double *__P, __m128d __A)
  168. {
  169.   __builtin_ia32_storeapd (__P, (__v2df)__A);
  170. }
  171.  
  172. /* Store two DPFP values.  The address need not be 16-byte aligned.  */
  173. static __inline void
  174. _mm_storeu_pd (double *__P, __m128d __A)
  175. {
  176.   __builtin_ia32_storeupd (__P, (__v2df)__A);
  177. }
  178.  
  179. /* Store two DPFP values in reverse order.  The address must be aligned.  */
  180. static __inline void
  181. _mm_storer_pd (double *__P, __m128d __A)
  182. {
  183.   __v2df __va = (__v2df)__A;
  184.   __v2df __tmp = __builtin_ia32_shufpd (__va, __va, _MM_SHUFFLE2 (0,1));
  185.   __builtin_ia32_storeapd (__P, __tmp);
  186. }
  187.  
  188. /* Sets the low DPFP value of A from the low value of B.  */
  189. static __inline __m128d
  190. _mm_move_sd (__m128d __A, __m128d __B)
  191. {
  192.   return (__m128d) __builtin_ia32_movsd ((__v2df)__A, (__v2df)__B);
  193. }
  194.  
  195.  
  196. static __inline __m128d
  197. _mm_add_pd (__m128d __A, __m128d __B)
  198. {
  199.   return (__m128d)__builtin_ia32_addpd ((__v2df)__A, (__v2df)__B);
  200. }
  201.  
  202. static __inline __m128d
  203. _mm_add_sd (__m128d __A, __m128d __B)
  204. {
  205.   return (__m128d)__builtin_ia32_addsd ((__v2df)__A, (__v2df)__B);
  206. }
  207.  
  208. static __inline __m128d
  209. _mm_sub_pd (__m128d __A, __m128d __B)
  210. {
  211.   return (__m128d)__builtin_ia32_subpd ((__v2df)__A, (__v2df)__B);
  212. }
  213.  
  214. static __inline __m128d
  215. _mm_sub_sd (__m128d __A, __m128d __B)
  216. {
  217.   return (__m128d)__builtin_ia32_subsd ((__v2df)__A, (__v2df)__B);
  218. }
  219.  
  220. static __inline __m128d
  221. _mm_mul_pd (__m128d __A, __m128d __B)
  222. {
  223.   return (__m128d)__builtin_ia32_mulpd ((__v2df)__A, (__v2df)__B);
  224. }
  225.  
  226. static __inline __m128d
  227. _mm_mul_sd (__m128d __A, __m128d __B)
  228. {
  229.   return (__m128d)__builtin_ia32_mulsd ((__v2df)__A, (__v2df)__B);
  230. }
  231.  
  232. static __inline __m128d
  233. _mm_div_pd (__m128d __A, __m128d __B)
  234. {
  235.   return (__m128d)__builtin_ia32_divpd ((__v2df)__A, (__v2df)__B);
  236. }
  237.  
  238. static __inline __m128d
  239. _mm_div_sd (__m128d __A, __m128d __B)
  240. {
  241.   return (__m128d)__builtin_ia32_divsd ((__v2df)__A, (__v2df)__B);
  242. }
  243.  
  244. static __inline __m128d
  245. _mm_sqrt_pd (__m128d __A)
  246. {
  247.   return (__m128d)__builtin_ia32_sqrtpd ((__v2df)__A);
  248. }
  249.  
  250. /* Return pair {sqrt (A[0), B[1]}.  */
  251. static __inline __m128d
  252. _mm_sqrt_sd (__m128d __A, __m128d __B)
  253. {
  254.   __v2df __tmp = __builtin_ia32_movsd ((__v2df)__A, (__v2df)__B);
  255.   return (__m128d)__builtin_ia32_sqrtsd ((__v2df)__tmp);
  256. }
  257.  
  258. static __inline __m128d
  259. _mm_min_pd (__m128d __A, __m128d __B)
  260. {
  261.   return (__m128d)__builtin_ia32_minpd ((__v2df)__A, (__v2df)__B);
  262. }
  263.  
  264. static __inline __m128d
  265. _mm_min_sd (__m128d __A, __m128d __B)
  266. {
  267.   return (__m128d)__builtin_ia32_minsd ((__v2df)__A, (__v2df)__B);
  268. }
  269.  
  270. static __inline __m128d
  271. _mm_max_pd (__m128d __A, __m128d __B)
  272. {
  273.   return (__m128d)__builtin_ia32_maxpd ((__v2df)__A, (__v2df)__B);
  274. }
  275.  
  276. static __inline __m128d
  277. _mm_max_sd (__m128d __A, __m128d __B)
  278. {
  279.   return (__m128d)__builtin_ia32_maxsd ((__v2df)__A, (__v2df)__B);
  280. }
  281.  
  282. static __inline __m128d
  283. _mm_and_pd (__m128d __A, __m128d __B)
  284. {
  285.   return (__m128d)__builtin_ia32_andpd ((__v2df)__A, (__v2df)__B);
  286. }
  287.  
  288. static __inline __m128d
  289. _mm_andnot_pd (__m128d __A, __m128d __B)
  290. {
  291.   return (__m128d)__builtin_ia32_andnpd ((__v2df)__A, (__v2df)__B);
  292. }
  293.  
  294. static __inline __m128d
  295. _mm_or_pd (__m128d __A, __m128d __B)
  296. {
  297.   return (__m128d)__builtin_ia32_orpd ((__v2df)__A, (__v2df)__B);
  298. }
  299.  
  300. static __inline __m128d
  301. _mm_xor_pd (__m128d __A, __m128d __B)
  302. {
  303.   return (__m128d)__builtin_ia32_xorpd ((__v2df)__A, (__v2df)__B);
  304. }
  305.  
  306. static __inline __m128d
  307. _mm_cmpeq_pd (__m128d __A, __m128d __B)
  308. {
  309.   return (__m128d)__builtin_ia32_cmpeqpd ((__v2df)__A, (__v2df)__B);
  310. }
  311.  
  312. static __inline __m128d
  313. _mm_cmplt_pd (__m128d __A, __m128d __B)
  314. {
  315.   return (__m128d)__builtin_ia32_cmpltpd ((__v2df)__A, (__v2df)__B);
  316. }
  317.  
  318. static __inline __m128d
  319. _mm_cmple_pd (__m128d __A, __m128d __B)
  320. {
  321.   return (__m128d)__builtin_ia32_cmplepd ((__v2df)__A, (__v2df)__B);
  322. }
  323.  
  324. static __inline __m128d
  325. _mm_cmpgt_pd (__m128d __A, __m128d __B)
  326. {
  327.   return (__m128d)__builtin_ia32_cmpgtpd ((__v2df)__A, (__v2df)__B);
  328. }
  329.  
  330. static __inline __m128d
  331. _mm_cmpge_pd (__m128d __A, __m128d __B)
  332. {
  333.   return (__m128d)__builtin_ia32_cmpgepd ((__v2df)__A, (__v2df)__B);
  334. }
  335.  
  336. static __inline __m128d
  337. _mm_cmpneq_pd (__m128d __A, __m128d __B)
  338. {
  339.   return (__m128d)__builtin_ia32_cmpneqpd ((__v2df)__A, (__v2df)__B);
  340. }
  341.  
  342. static __inline __m128d
  343. _mm_cmpnlt_pd (__m128d __A, __m128d __B)
  344. {
  345.   return (__m128d)__builtin_ia32_cmpnltpd ((__v2df)__A, (__v2df)__B);
  346. }
  347.  
  348. static __inline __m128d
  349. _mm_cmpnle_pd (__m128d __A, __m128d __B)
  350. {
  351.   return (__m128d)__builtin_ia32_cmpnlepd ((__v2df)__A, (__v2df)__B);
  352. }
  353.  
  354. static __inline __m128d
  355. _mm_cmpngt_pd (__m128d __A, __m128d __B)
  356. {
  357.   return (__m128d)__builtin_ia32_cmpngtpd ((__v2df)__A, (__v2df)__B);
  358. }
  359.  
  360. static __inline __m128d
  361. _mm_cmpnge_pd (__m128d __A, __m128d __B)
  362. {
  363.   return (__m128d)__builtin_ia32_cmpngepd ((__v2df)__A, (__v2df)__B);
  364. }
  365.  
  366. static __inline __m128d
  367. _mm_cmpord_pd (__m128d __A, __m128d __B)
  368. {
  369.   return (__m128d)__builtin_ia32_cmpordpd ((__v2df)__A, (__v2df)__B);
  370. }
  371.  
  372. static __inline __m128d
  373. _mm_cmpunord_pd (__m128d __A, __m128d __B)
  374. {
  375.   return (__m128d)__builtin_ia32_cmpunordpd ((__v2df)__A, (__v2df)__B);
  376. }
  377.  
  378. static __inline __m128d
  379. _mm_cmpeq_sd (__m128d __A, __m128d __B)
  380. {
  381.   return (__m128d)__builtin_ia32_cmpeqsd ((__v2df)__A, (__v2df)__B);
  382. }
  383.  
  384. static __inline __m128d
  385. _mm_cmplt_sd (__m128d __A, __m128d __B)
  386. {
  387.   return (__m128d)__builtin_ia32_cmpltsd ((__v2df)__A, (__v2df)__B);
  388. }
  389.  
  390. static __inline __m128d
  391. _mm_cmple_sd (__m128d __A, __m128d __B)
  392. {
  393.   return (__m128d)__builtin_ia32_cmplesd ((__v2df)__A, (__v2df)__B);
  394. }
  395.  
  396. static __inline __m128d
  397. _mm_cmpgt_sd (__m128d __A, __m128d __B)
  398. {
  399.   return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
  400.                      (__v2df)
  401.                      __builtin_ia32_cmpltsd ((__v2df) __B,
  402.                                  (__v2df)
  403.                                  __A));
  404. }
  405.  
  406. static __inline __m128d
  407. _mm_cmpge_sd (__m128d __A, __m128d __B)
  408. {
  409.   return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
  410.                      (__v2df)
  411.                      __builtin_ia32_cmplesd ((__v2df) __B,
  412.                                  (__v2df)
  413.                                  __A));
  414. }
  415.  
  416. static __inline __m128d
  417. _mm_cmpneq_sd (__m128d __A, __m128d __B)
  418. {
  419.   return (__m128d)__builtin_ia32_cmpneqsd ((__v2df)__A, (__v2df)__B);
  420. }
  421.  
  422. static __inline __m128d
  423. _mm_cmpnlt_sd (__m128d __A, __m128d __B)
  424. {
  425.   return (__m128d)__builtin_ia32_cmpnltsd ((__v2df)__A, (__v2df)__B);
  426. }
  427.  
  428. static __inline __m128d
  429. _mm_cmpnle_sd (__m128d __A, __m128d __B)
  430. {
  431.   return (__m128d)__builtin_ia32_cmpnlesd ((__v2df)__A, (__v2df)__B);
  432. }
  433.  
  434. static __inline __m128d
  435. _mm_cmpngt_sd (__m128d __A, __m128d __B)
  436. {
  437.   return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
  438.                      (__v2df)
  439.                      __builtin_ia32_cmpnltsd ((__v2df) __B,
  440.                                   (__v2df)
  441.                                   __A));
  442. }
  443.  
  444. static __inline __m128d
  445. _mm_cmpnge_sd (__m128d __A, __m128d __B)
  446. {
  447.   return (__m128d) __builtin_ia32_movsd ((__v2df) __A,
  448.                      (__v2df)
  449.                      __builtin_ia32_cmpnlesd ((__v2df) __B,
  450.                                   (__v2df)
  451.                                   __A));
  452. }
  453.  
  454. static __inline __m128d
  455. _mm_cmpord_sd (__m128d __A, __m128d __B)
  456. {
  457.   return (__m128d)__builtin_ia32_cmpordsd ((__v2df)__A, (__v2df)__B);
  458. }
  459.  
  460. static __inline __m128d
  461. _mm_cmpunord_sd (__m128d __A, __m128d __B)
  462. {
  463.   return (__m128d)__builtin_ia32_cmpunordsd ((__v2df)__A, (__v2df)__B);
  464. }
  465.  
  466. static __inline int
  467. _mm_comieq_sd (__m128d __A, __m128d __B)
  468. {
  469.   return __builtin_ia32_comisdeq ((__v2df)__A, (__v2df)__B);
  470. }
  471.  
  472. static __inline int
  473. _mm_comilt_sd (__m128d __A, __m128d __B)
  474. {
  475.   return __builtin_ia32_comisdlt ((__v2df)__A, (__v2df)__B);
  476. }
  477.  
  478. static __inline int
  479. _mm_comile_sd (__m128d __A, __m128d __B)
  480. {
  481.   return __builtin_ia32_comisdle ((__v2df)__A, (__v2df)__B);
  482. }
  483.  
  484. static __inline int
  485. _mm_comigt_sd (__m128d __A, __m128d __B)
  486. {
  487.   return __builtin_ia32_comisdgt ((__v2df)__A, (__v2df)__B);
  488. }
  489.  
  490. static __inline int
  491. _mm_comige_sd (__m128d __A, __m128d __B)
  492. {
  493.   return __builtin_ia32_comisdge ((__v2df)__A, (__v2df)__B);
  494. }
  495.  
  496. static __inline int
  497. _mm_comineq_sd (__m128d __A, __m128d __B)
  498. {
  499.   return __builtin_ia32_comisdneq ((__v2df)__A, (__v2df)__B);
  500. }
  501.  
  502. static __inline int
  503. _mm_ucomieq_sd (__m128d __A, __m128d __B)
  504. {
  505.   return __builtin_ia32_ucomisdeq ((__v2df)__A, (__v2df)__B);
  506. }
  507.  
  508. static __inline int
  509. _mm_ucomilt_sd (__m128d __A, __m128d __B)
  510. {
  511.   return __builtin_ia32_ucomisdlt ((__v2df)__A, (__v2df)__B);
  512. }
  513.  
  514. static __inline int
  515. _mm_ucomile_sd (__m128d __A, __m128d __B)
  516. {
  517.   return __builtin_ia32_ucomisdle ((__v2df)__A, (__v2df)__B);
  518. }
  519.  
  520. static __inline int
  521. _mm_ucomigt_sd (__m128d __A, __m128d __B)
  522. {
  523.   return __builtin_ia32_ucomisdgt ((__v2df)__A, (__v2df)__B);
  524. }
  525.  
  526. static __inline int
  527. _mm_ucomige_sd (__m128d __A, __m128d __B)
  528. {
  529.   return __builtin_ia32_ucomisdge ((__v2df)__A, (__v2df)__B);
  530. }
  531.  
  532. static __inline int
  533. _mm_ucomineq_sd (__m128d __A, __m128d __B)
  534. {
  535.   return __builtin_ia32_ucomisdneq ((__v2df)__A, (__v2df)__B);
  536. }
  537.  
  538. /* Create a vector with element 0 as *P and the rest zero.  */
  539.  
  540. static __inline __m128i
  541. _mm_load_si128 (__m128i const *__P)
  542. {
  543.   return (__m128i) __builtin_ia32_loaddqa ((char const *)__P);
  544. }
  545.  
  546. static __inline __m128i
  547. _mm_loadu_si128 (__m128i const *__P)
  548. {
  549.   return (__m128i) __builtin_ia32_loaddqu ((char const *)__P);
  550. }
  551.  
  552. static __inline __m128i
  553. _mm_loadl_epi64 (__m128i const *__P)
  554. {
  555.   return (__m128i) __builtin_ia32_movq2dq (*(unsigned long long *)__P);
  556. }
  557.  
  558. static __inline void
  559. _mm_store_si128 (__m128i *__P, __m128i __B)
  560. {
  561.   __builtin_ia32_storedqa ((char *)__P, (__v16qi)__B);
  562. }
  563.  
  564. static __inline void
  565. _mm_storeu_si128 (__m128i *__P, __m128i __B)
  566. {
  567.   __builtin_ia32_storedqu ((char *)__P, (__v16qi)__B);
  568. }
  569.  
  570. static __inline void
  571. _mm_storel_epi64 (__m128i *__P, __m128i __B)
  572. {
  573.   *(long long *)__P = __builtin_ia32_movdq2q ((__v2di)__B);
  574. }
  575.  
  576. static __inline __m64
  577. _mm_movepi64_pi64 (__m128i __B)
  578. {
  579.   return (__m64) __builtin_ia32_movdq2q ((__v2di)__B);
  580. }
  581.  
  582. static __inline __m128i
  583. _mm_move_epi64 (__m128i __A)
  584. {
  585.   return (__m128i) __builtin_ia32_movq ((__v2di)__A);
  586. }
  587.  
  588. /* Create a vector of zeros.  */
  589. static __inline __m128i
  590. _mm_setzero_si128 (void)
  591. {
  592.   return (__m128i) __builtin_ia32_setzero128 ();
  593. }
  594.  
  595. static __inline __m128i
  596. _mm_set_epi64 (__m64 __A,  __m64 __B)
  597. {
  598.   __v2di __tmp = (__v2di)__builtin_ia32_movq2dq ((unsigned long long)__A);
  599.   __v2di __tmp2 = (__v2di)__builtin_ia32_movq2dq ((unsigned long long)__B);
  600.   return (__m128i)__builtin_ia32_punpcklqdq128 (__tmp2, __tmp);
  601. }
  602.  
  603. /* Create the vector [Z Y X W].  */
  604. static __inline __m128i
  605. _mm_set_epi32 (int __Z, int __Y, int __X, int __W)
  606. {
  607.   union {
  608.     int __a[4];
  609.     __m128i __v;
  610.   } __u;
  611.  
  612.   __u.__a[0] = __W;
  613.   __u.__a[1] = __X;
  614.   __u.__a[2] = __Y;
  615.   __u.__a[3] = __Z;
  616.  
  617.   return __u.__v;
  618. }
  619.  
  620. #ifdef __x86_64__
  621. /* Create the vector [Z Y].  */
  622. static __inline __m128i
  623. _mm_set_epi64x (long long __Z, long long __Y)
  624. {
  625.   union {
  626.     long __a[2];
  627.     __m128i __v;
  628.   } __u;
  629.  
  630.   __u.__a[0] = __Y;
  631.   __u.__a[1] = __Z;
  632.  
  633.   return __u.__v;
  634. }
  635. #endif
  636.  
  637. /* Create the vector [S T U V Z Y X W].  */
  638. static __inline __m128i
  639. _mm_set_epi16 (short __Z, short __Y, short __X, short __W,
  640.            short __V, short __U, short __T, short __S)
  641. {
  642.   union {
  643.     short __a[8];
  644.     __m128i __v;
  645.   } __u;
  646.  
  647.   __u.__a[0] = __S;
  648.   __u.__a[1] = __T;
  649.   __u.__a[2] = __U;
  650.   __u.__a[3] = __V;
  651.   __u.__a[4] = __W;
  652.   __u.__a[5] = __X;
  653.   __u.__a[6] = __Y;
  654.   __u.__a[7] = __Z;
  655.  
  656.   return __u.__v;
  657. }
  658.  
  659. /* Create the vector [S T U V Z Y X W].  */
  660. static __inline __m128i
  661. _mm_set_epi8 (char __Z, char __Y, char __X, char __W,
  662.           char __V, char __U, char __T, char __S,
  663.           char __Z1, char __Y1, char __X1, char __W1,
  664.           char __V1, char __U1, char __T1, char __S1)
  665. {
  666.   union {
  667.     char __a[16];
  668.     __m128i __v;
  669.   } __u;
  670.  
  671.   __u.__a[0] = __S1;
  672.   __u.__a[1] = __T1;
  673.   __u.__a[2] = __U1;
  674.   __u.__a[3] = __V1;
  675.   __u.__a[4] = __W1;
  676.   __u.__a[5] = __X1;
  677.   __u.__a[6] = __Y1;
  678.   __u.__a[7] = __Z1;
  679.   __u.__a[8] = __S;
  680.   __u.__a[9] = __T;
  681.   __u.__a[10] = __U;
  682.   __u.__a[11] = __V;
  683.   __u.__a[12] = __W;
  684.   __u.__a[13] = __X;
  685.   __u.__a[14] = __Y;
  686.   __u.__a[15] = __Z;
  687.  
  688.   return __u.__v;
  689. }
  690.  
  691. static __inline __m128i
  692. _mm_set1_epi64 (__m64 __A)
  693. {
  694.   __v2di __tmp = (__v2di)__builtin_ia32_movq2dq ((unsigned long long)__A);
  695.   return (__m128i)__builtin_ia32_punpcklqdq128 (__tmp, __tmp);
  696. }
  697.  
  698. static __inline __m128i
  699. _mm_set1_epi32 (int __A)
  700. {
  701.   __v4si __tmp = (__v4si)__builtin_ia32_loadd (&__A);
  702.   return (__m128i) __builtin_ia32_pshufd ((__v4si)__tmp, _MM_SHUFFLE (0,0,0,0));
  703. }
  704.  
  705. #ifdef __x86_64__
  706. static __inline __m128i
  707. _mm_set1_epi64x (long long __A)
  708. {
  709.   __v2di __tmp = (__v2di)__builtin_ia32_movq2dq ((unsigned long long)__A);
  710.   return (__m128i) __builtin_ia32_shufpd ((__v2df)__tmp, (__v2df)__tmp, _MM_SHUFFLE2 (0,0));
  711. }
  712. #endif
  713.  
  714. static __inline __m128i
  715. _mm_set1_epi16 (short __A)
  716. {
  717.   int __Acopy = (unsigned short)__A;
  718.   __v4si __tmp = (__v4si)__builtin_ia32_loadd (&__Acopy);
  719.   __tmp = (__v4si)__builtin_ia32_punpcklwd128 ((__v8hi)__tmp, (__v8hi)__tmp);
  720.   return (__m128i) __builtin_ia32_pshufd ((__v4si)__tmp, _MM_SHUFFLE (0,0,0,0));
  721. }
  722.  
  723. static __inline __m128i
  724. _mm_set1_epi8 (char __A)
  725. {
  726.   int __Acopy = (unsigned char)__A;
  727.   __v4si __tmp = (__v4si)__builtin_ia32_loadd (&__Acopy);
  728.   __tmp = (__v4si)__builtin_ia32_punpcklbw128 ((__v16qi)__tmp, (__v16qi)__tmp);
  729.   __tmp = (__v4si)__builtin_ia32_punpcklbw128 ((__v16qi)__tmp, (__v16qi)__tmp);
  730.   return (__m128i) __builtin_ia32_pshufd ((__v4si)__tmp, _MM_SHUFFLE (0,0,0,0));
  731. }
  732.  
  733. static __inline __m128i
  734. _mm_setr_epi64 (__m64 __A,  __m64 __B)
  735. {
  736.   __v2di __tmp = (__v2di)__builtin_ia32_movq2dq ((unsigned long long)__A);
  737.   __v2di __tmp2 = (__v2di)__builtin_ia32_movq2dq ((unsigned long long)__B);
  738.   return (__m128i)__builtin_ia32_punpcklqdq128 (__tmp, __tmp2);
  739. }
  740.  
  741. /* Create the vector [Z Y X W].  */
  742. static __inline __m128i
  743. _mm_setr_epi32 (int __W, int __X, int __Y, int __Z)
  744. {
  745.   union {
  746.     int __a[4];
  747.     __m128i __v;
  748.   } __u;
  749.  
  750.   __u.__a[0] = __W;
  751.   __u.__a[1] = __X;
  752.   __u.__a[2] = __Y;
  753.   __u.__a[3] = __Z;
  754.  
  755.   return __u.__v;
  756. }
  757. /* Create the vector [S T U V Z Y X W].  */
  758. static __inline __m128i
  759. _mm_setr_epi16 (short __S, short __T, short __U, short __V,
  760.             short __W, short __X, short __Y, short __Z)
  761. {
  762.   union {
  763.     short __a[8];
  764.     __m128i __v;
  765.   } __u;
  766.  
  767.   __u.__a[0] = __S;
  768.   __u.__a[1] = __T;
  769.   __u.__a[2] = __U;
  770.   __u.__a[3] = __V;
  771.   __u.__a[4] = __W;
  772.   __u.__a[5] = __X;
  773.   __u.__a[6] = __Y;
  774.   __u.__a[7] = __Z;
  775.  
  776.   return __u.__v;
  777. }
  778.  
  779. /* Create the vector [S T U V Z Y X W].  */
  780. static __inline __m128i
  781. _mm_setr_epi8 (char __S1, char __T1, char __U1, char __V1,
  782.            char __W1, char __X1, char __Y1, char __Z1,
  783.            char __S, char __T, char __U, char __V,
  784.            char __W, char __X, char __Y, char __Z)
  785. {
  786.   union {
  787.     char __a[16];
  788.     __m128i __v;
  789.   } __u;
  790.  
  791.   __u.__a[0] = __S1;
  792.   __u.__a[1] = __T1;
  793.   __u.__a[2] = __U1;
  794.   __u.__a[3] = __V1;
  795.   __u.__a[4] = __W1;
  796.   __u.__a[5] = __X1;
  797.   __u.__a[6] = __Y1;
  798.   __u.__a[7] = __Z1;
  799.   __u.__a[8] = __S;
  800.   __u.__a[9] = __T;
  801.   __u.__a[10] = __U;
  802.   __u.__a[11] = __V;
  803.   __u.__a[12] = __W;
  804.   __u.__a[13] = __X;
  805.   __u.__a[14] = __Y;
  806.   __u.__a[15] = __Z;
  807.  
  808.   return __u.__v;
  809. }
  810.  
  811. static __inline __m128d
  812. _mm_cvtepi32_pd (__m128i __A)
  813. {
  814.   return (__m128d)__builtin_ia32_cvtdq2pd ((__v4si) __A);
  815. }
  816.  
  817. static __inline __m128
  818. _mm_cvtepi32_ps (__m128i __A)
  819. {
  820.   return (__m128)__builtin_ia32_cvtdq2ps ((__v4si) __A);
  821. }
  822.  
  823. static __inline __m128i
  824. _mm_cvtpd_epi32 (__m128d __A)
  825. {
  826.   return (__m128i)__builtin_ia32_cvtpd2dq ((__v2df) __A);
  827. }
  828.  
  829. static __inline __m64
  830. _mm_cvtpd_pi32 (__m128d __A)
  831. {
  832.   return (__m64)__builtin_ia32_cvtpd2pi ((__v2df) __A);
  833. }
  834.  
  835. static __inline __m128
  836. _mm_cvtpd_ps (__m128d __A)
  837. {
  838.   return (__m128)__builtin_ia32_cvtpd2ps ((__v2df) __A);
  839. }
  840.  
  841. static __inline __m128i
  842. _mm_cvttpd_epi32 (__m128d __A)
  843. {
  844.   return (__m128i)__builtin_ia32_cvttpd2dq ((__v2df) __A);
  845. }
  846.  
  847. static __inline __m64
  848. _mm_cvttpd_pi32 (__m128d __A)
  849. {
  850.   return (__m64)__builtin_ia32_cvttpd2pi ((__v2df) __A);
  851. }
  852.  
  853. static __inline __m128d
  854. _mm_cvtpi32_pd (__m64 __A)
  855. {
  856.   return (__m128d)__builtin_ia32_cvtpi2pd ((__v2si) __A);
  857. }
  858.  
  859. static __inline __m128i
  860. _mm_cvtps_epi32 (__m128 __A)
  861. {
  862.   return (__m128i)__builtin_ia32_cvtps2dq ((__v4sf) __A);
  863. }
  864.  
  865. static __inline __m128i
  866. _mm_cvttps_epi32 (__m128 __A)
  867. {
  868.   return (__m128i)__builtin_ia32_cvttps2dq ((__v4sf) __A);
  869. }
  870.  
  871. static __inline __m128d
  872. _mm_cvtps_pd (__m128 __A)
  873. {
  874.   return (__m128d)__builtin_ia32_cvtps2pd ((__v4sf) __A);
  875. }
  876.  
  877. static __inline int
  878. _mm_cvtsd_si32 (__m128d __A)
  879. {
  880.   return __builtin_ia32_cvtsd2si ((__v2df) __A);
  881. }
  882.  
  883. #ifdef __x86_64__
  884. static __inline long long
  885. _mm_cvtsd_si64x (__m128d __A)
  886. {
  887.   return __builtin_ia32_cvtsd2si64 ((__v2df) __A);
  888. }
  889. #endif
  890.  
  891. static __inline int
  892. _mm_cvttsd_si32 (__m128d __A)
  893. {
  894.   return __builtin_ia32_cvttsd2si ((__v2df) __A);
  895. }
  896.  
  897. #ifdef __x86_64__
  898. static __inline long long
  899. _mm_cvttsd_si64x (__m128d __A)
  900. {
  901.   return __builtin_ia32_cvttsd2si64 ((__v2df) __A);
  902. }
  903. #endif
  904.  
  905. static __inline __m128
  906. _mm_cvtsd_ss (__m128 __A, __m128d __B)
  907. {
  908.   return (__m128)__builtin_ia32_cvtsd2ss ((__v4sf) __A, (__v2df) __B);
  909. }
  910.  
  911. static __inline __m128d
  912. _mm_cvtsi32_sd (__m128d __A, int __B)
  913. {
  914.   return (__m128d)__builtin_ia32_cvtsi2sd ((__v2df) __A, __B);
  915. }
  916.  
  917. #ifdef __x86_64__
  918. static __inline __m128d
  919. _mm_cvtsi64x_sd (__m128d __A, long long __B)
  920. {
  921.   return (__m128d)__builtin_ia32_cvtsi642sd ((__v2df) __A, __B);
  922. }
  923. #endif
  924.  
  925. static __inline __m128d
  926. _mm_cvtss_sd (__m128d __A, __m128 __B)
  927. {
  928.   return (__m128d)__builtin_ia32_cvtss2sd ((__v2df) __A, (__v4sf)__B);
  929. }
  930.  
  931. #define _mm_shuffle_pd(__A, __B, __C) ((__m128d)__builtin_ia32_shufpd ((__v2df)__A, (__v2df)__B, (__C)))
  932.  
  933. static __inline __m128d
  934. _mm_unpackhi_pd (__m128d __A, __m128d __B)
  935. {
  936.   return (__m128d)__builtin_ia32_unpckhpd ((__v2df)__A, (__v2df)__B);
  937. }
  938.  
  939. static __inline __m128d
  940. _mm_unpacklo_pd (__m128d __A, __m128d __B)
  941. {
  942.   return (__m128d)__builtin_ia32_unpcklpd ((__v2df)__A, (__v2df)__B);
  943. }
  944.  
  945. static __inline __m128d
  946. _mm_loadh_pd (__m128d __A, double const *__B)
  947. {
  948.   return (__m128d)__builtin_ia32_loadhpd ((__v2df)__A, (__v2si *)__B);
  949. }
  950.  
  951. static __inline void
  952. _mm_storeh_pd (double *__A, __m128d __B)
  953. {
  954.   __builtin_ia32_storehpd ((__v2si *)__A, (__v2df)__B);
  955. }
  956.  
  957. static __inline __m128d
  958. _mm_loadl_pd (__m128d __A, double const *__B)
  959. {
  960.   return (__m128d)__builtin_ia32_loadlpd ((__v2df)__A, (__v2si *)__B);
  961. }
  962.  
  963. static __inline void
  964. _mm_storel_pd (double *__A, __m128d __B)
  965. {
  966.   __builtin_ia32_storelpd ((__v2si *)__A, (__v2df)__B);
  967. }
  968.  
  969. static __inline int
  970. _mm_movemask_pd (__m128d __A)
  971. {
  972.   return __builtin_ia32_movmskpd ((__v2df)__A);
  973. }
  974.  
  975. static __inline __m128i
  976. _mm_packs_epi16 (__m128i __A, __m128i __B)
  977. {
  978.   return (__m128i)__builtin_ia32_packsswb128 ((__v8hi)__A, (__v8hi)__B);
  979. }
  980.  
  981. static __inline __m128i
  982. _mm_packs_epi32 (__m128i __A, __m128i __B)
  983. {
  984.   return (__m128i)__builtin_ia32_packssdw128 ((__v4si)__A, (__v4si)__B);
  985. }
  986.  
  987. static __inline __m128i
  988. _mm_packus_epi16 (__m128i __A, __m128i __B)
  989. {
  990.   return (__m128i)__builtin_ia32_packuswb128 ((__v8hi)__A, (__v8hi)__B);
  991. }
  992.  
  993. static __inline __m128i
  994. _mm_unpackhi_epi8 (__m128i __A, __m128i __B)
  995. {
  996.   return (__m128i)__builtin_ia32_punpckhbw128 ((__v16qi)__A, (__v16qi)__B);
  997. }
  998.  
  999. static __inline __m128i
  1000. _mm_unpackhi_epi16 (__m128i __A, __m128i __B)
  1001. {
  1002.   return (__m128i)__builtin_ia32_punpckhwd128 ((__v8hi)__A, (__v8hi)__B);
  1003. }
  1004.  
  1005. static __inline __m128i
  1006. _mm_unpackhi_epi32 (__m128i __A, __m128i __B)
  1007. {
  1008.   return (__m128i)__builtin_ia32_punpckhdq128 ((__v4si)__A, (__v4si)__B);
  1009. }
  1010.  
  1011. static __inline __m128i
  1012. _mm_unpackhi_epi64 (__m128i __A, __m128i __B)
  1013. {
  1014.   return (__m128i)__builtin_ia32_punpckhqdq128 ((__v2di)__A, (__v2di)__B);
  1015. }
  1016.  
  1017. static __inline __m128i
  1018. _mm_unpacklo_epi8 (__m128i __A, __m128i __B)
  1019. {
  1020.   return (__m128i)__builtin_ia32_punpcklbw128 ((__v16qi)__A, (__v16qi)__B);
  1021. }
  1022.  
  1023. static __inline __m128i
  1024. _mm_unpacklo_epi16 (__m128i __A, __m128i __B)
  1025. {
  1026.   return (__m128i)__builtin_ia32_punpcklwd128 ((__v8hi)__A, (__v8hi)__B);
  1027. }
  1028.  
  1029. static __inline __m128i
  1030. _mm_unpacklo_epi32 (__m128i __A, __m128i __B)
  1031. {
  1032.   return (__m128i)__builtin_ia32_punpckldq128 ((__v4si)__A, (__v4si)__B);
  1033. }
  1034.  
  1035. static __inline __m128i
  1036. _mm_unpacklo_epi64 (__m128i __A, __m128i __B)
  1037. {
  1038.   return (__m128i)__builtin_ia32_punpcklqdq128 ((__v2di)__A, (__v2di)__B);
  1039. }
  1040.  
  1041. static __inline __m128i
  1042. _mm_add_epi8 (__m128i __A, __m128i __B)
  1043. {
  1044.   return (__m128i)__builtin_ia32_paddb128 ((__v16qi)__A, (__v16qi)__B);
  1045. }
  1046.  
  1047. static __inline __m128i
  1048. _mm_add_epi16 (__m128i __A, __m128i __B)
  1049. {
  1050.   return (__m128i)__builtin_ia32_paddw128 ((__v8hi)__A, (__v8hi)__B);
  1051. }
  1052.  
  1053. static __inline __m128i
  1054. _mm_add_epi32 (__m128i __A, __m128i __B)
  1055. {
  1056.   return (__m128i)__builtin_ia32_paddd128 ((__v4si)__A, (__v4si)__B);
  1057. }
  1058.  
  1059. static __inline __m128i
  1060. _mm_add_epi64 (__m128i __A, __m128i __B)
  1061. {
  1062.   return (__m128i)__builtin_ia32_paddq128 ((__v2di)__A, (__v2di)__B);
  1063. }
  1064.  
  1065. static __inline __m128i
  1066. _mm_adds_epi8 (__m128i __A, __m128i __B)
  1067. {
  1068.   return (__m128i)__builtin_ia32_paddsb128 ((__v16qi)__A, (__v16qi)__B);
  1069. }
  1070.  
  1071. static __inline __m128i
  1072. _mm_adds_epi16 (__m128i __A, __m128i __B)
  1073. {
  1074.   return (__m128i)__builtin_ia32_paddsw128 ((__v8hi)__A, (__v8hi)__B);
  1075. }
  1076.  
  1077. static __inline __m128i
  1078. _mm_adds_epu8 (__m128i __A, __m128i __B)
  1079. {
  1080.   return (__m128i)__builtin_ia32_paddusb128 ((__v16qi)__A, (__v16qi)__B);
  1081. }
  1082.  
  1083. static __inline __m128i
  1084. _mm_adds_epu16 (__m128i __A, __m128i __B)
  1085. {
  1086.   return (__m128i)__builtin_ia32_paddusw128 ((__v8hi)__A, (__v8hi)__B);
  1087. }
  1088.  
  1089. static __inline __m128i
  1090. _mm_sub_epi8 (__m128i __A, __m128i __B)
  1091. {
  1092.   return (__m128i)__builtin_ia32_psubb128 ((__v16qi)__A, (__v16qi)__B);
  1093. }
  1094.  
  1095. static __inline __m128i
  1096. _mm_sub_epi16 (__m128i __A, __m128i __B)
  1097. {
  1098.   return (__m128i)__builtin_ia32_psubw128 ((__v8hi)__A, (__v8hi)__B);
  1099. }
  1100.  
  1101. static __inline __m128i
  1102. _mm_sub_epi32 (__m128i __A, __m128i __B)
  1103. {
  1104.   return (__m128i)__builtin_ia32_psubd128 ((__v4si)__A, (__v4si)__B);
  1105. }
  1106.  
  1107. static __inline __m128i
  1108. _mm_sub_epi64 (__m128i __A, __m128i __B)
  1109. {
  1110.   return (__m128i)__builtin_ia32_psubq128 ((__v2di)__A, (__v2di)__B);
  1111. }
  1112.  
  1113. static __inline __m128i
  1114. _mm_subs_epi8 (__m128i __A, __m128i __B)
  1115. {
  1116.   return (__m128i)__builtin_ia32_psubsb128 ((__v16qi)__A, (__v16qi)__B);
  1117. }
  1118.  
  1119. static __inline __m128i
  1120. _mm_subs_epi16 (__m128i __A, __m128i __B)
  1121. {
  1122.   return (__m128i)__builtin_ia32_psubsw128 ((__v8hi)__A, (__v8hi)__B);
  1123. }
  1124.  
  1125. static __inline __m128i
  1126. _mm_subs_epu8 (__m128i __A, __m128i __B)
  1127. {
  1128.   return (__m128i)__builtin_ia32_psubusb128 ((__v16qi)__A, (__v16qi)__B);
  1129. }
  1130.  
  1131. static __inline __m128i
  1132. _mm_subs_epu16 (__m128i __A, __m128i __B)
  1133. {
  1134.   return (__m128i)__builtin_ia32_psubusw128 ((__v8hi)__A, (__v8hi)__B);
  1135. }
  1136.  
  1137. static __inline __m128i
  1138. _mm_madd_epi16 (__m128i __A, __m128i __B)
  1139. {
  1140.   return (__m128i)__builtin_ia32_pmaddwd128 ((__v8hi)__A, (__v8hi)__B);
  1141. }
  1142.  
  1143. static __inline __m128i
  1144. _mm_mulhi_epi16 (__m128i __A, __m128i __B)
  1145. {
  1146.   return (__m128i)__builtin_ia32_pmulhw128 ((__v8hi)__A, (__v8hi)__B);
  1147. }
  1148.  
  1149. static __inline __m128i
  1150. _mm_mullo_epi16 (__m128i __A, __m128i __B)
  1151. {
  1152.   return (__m128i)__builtin_ia32_pmullw128 ((__v8hi)__A, (__v8hi)__B);
  1153. }
  1154.  
  1155. static __inline __m64
  1156. _mm_mul_su32 (__m64 __A, __m64 __B)
  1157. {
  1158.   return (__m64)__builtin_ia32_pmuludq ((__v2si)__A, (__v2si)__B);
  1159. }
  1160.  
  1161. static __inline __m128i
  1162. _mm_mul_epu32 (__m128i __A, __m128i __B)
  1163. {
  1164.   return (__m128i)__builtin_ia32_pmuludq128 ((__v4si)__A, (__v4si)__B);
  1165. }
  1166.  
  1167. static __inline __m128i
  1168. _mm_sll_epi16 (__m128i __A, __m128i __B)
  1169. {
  1170.   return (__m128i)__builtin_ia32_psllw128 ((__v8hi)__A, (__v2di)__B);
  1171. }
  1172.  
  1173. static __inline __m128i
  1174. _mm_sll_epi32 (__m128i __A, __m128i __B)
  1175. {
  1176.   return (__m128i)__builtin_ia32_pslld128 ((__v4si)__A, (__v2di)__B);
  1177. }
  1178.  
  1179. static __inline __m128i
  1180. _mm_sll_epi64 (__m128i __A, __m128i __B)
  1181. {
  1182.   return (__m128i)__builtin_ia32_psllq128 ((__v2di)__A, (__v2di)__B);
  1183. }
  1184.  
  1185. static __inline __m128i
  1186. _mm_sra_epi16 (__m128i __A, __m128i __B)
  1187. {
  1188.   return (__m128i)__builtin_ia32_psraw128 ((__v8hi)__A, (__v2di)__B);
  1189. }
  1190.  
  1191. static __inline __m128i
  1192. _mm_sra_epi32 (__m128i __A, __m128i __B)
  1193. {
  1194.   return (__m128i)__builtin_ia32_psrad128 ((__v4si)__A, (__v2di)__B);
  1195. }
  1196.  
  1197. static __inline __m128i
  1198. _mm_srl_epi16 (__m128i __A, __m128i __B)
  1199. {
  1200.   return (__m128i)__builtin_ia32_psrlw128 ((__v8hi)__A, (__v2di)__B);
  1201. }
  1202.  
  1203. static __inline __m128i
  1204. _mm_srl_epi32 (__m128i __A, __m128i __B)
  1205. {
  1206.   return (__m128i)__builtin_ia32_psrld128 ((__v4si)__A, (__v2di)__B);
  1207. }
  1208.  
  1209. static __inline __m128i
  1210. _mm_srl_epi64 (__m128i __A, __m128i __B)
  1211. {
  1212.   return (__m128i)__builtin_ia32_psrlq128 ((__v2di)__A, (__v2di)__B);
  1213. }
  1214.  
  1215. static __inline __m128i
  1216. _mm_slli_epi16 (__m128i __A, int __B)
  1217. {
  1218.   return (__m128i)__builtin_ia32_psllwi128 ((__v8hi)__A, __B);
  1219. }
  1220.  
  1221. static __inline __m128i
  1222. _mm_slli_epi32 (__m128i __A, int __B)
  1223. {
  1224.   return (__m128i)__builtin_ia32_pslldi128 ((__v4si)__A, __B);
  1225. }
  1226.  
  1227. static __inline __m128i
  1228. _mm_slli_epi64 (__m128i __A, int __B)
  1229. {
  1230.   return (__m128i)__builtin_ia32_psllqi128 ((__v2di)__A, __B);
  1231. }
  1232.  
  1233. static __inline __m128i
  1234. _mm_srai_epi16 (__m128i __A, int __B)
  1235. {
  1236.   return (__m128i)__builtin_ia32_psrawi128 ((__v8hi)__A, __B);
  1237. }
  1238.  
  1239. static __inline __m128i
  1240. _mm_srai_epi32 (__m128i __A, int __B)
  1241. {
  1242.   return (__m128i)__builtin_ia32_psradi128 ((__v4si)__A, __B);
  1243. }
  1244.  
  1245. #if 0
  1246. static __m128i __attribute__((__always_inline__))
  1247. _mm_srli_si128 (__m128i __A, const int __B)
  1248. {
  1249.   return ((__m128i)__builtin_ia32_psrldqi128 (__A, __B))
  1250. }
  1251.  
  1252. static __m128i __attribute__((__always_inline__))
  1253. _mm_srli_si128 (__m128i __A, const int __B)
  1254. {
  1255.   return ((__m128i)__builtin_ia32_pslldqi128 (__A, __B))
  1256. }
  1257. #endif
  1258. #define _mm_srli_si128(__A, __B) ((__m128i)__builtin_ia32_psrldqi128 (__A, __B))
  1259. #define _mm_slli_si128(__A, __B) ((__m128i)__builtin_ia32_pslldqi128 (__A, __B))
  1260.  
  1261. static __inline __m128i
  1262. _mm_srli_epi16 (__m128i __A, int __B)
  1263. {
  1264.   return (__m128i)__builtin_ia32_psrlwi128 ((__v8hi)__A, __B);
  1265. }
  1266.  
  1267. static __inline __m128i
  1268. _mm_srli_epi32 (__m128i __A, int __B)
  1269. {
  1270.   return (__m128i)__builtin_ia32_psrldi128 ((__v4si)__A, __B);
  1271. }
  1272.  
  1273. static __inline __m128i
  1274. _mm_srli_epi64 (__m128i __A, int __B)
  1275. {
  1276.   return (__m128i)__builtin_ia32_psrlqi128 ((__v2di)__A, __B);
  1277. }
  1278.  
  1279. static __inline __m128i
  1280. _mm_and_si128 (__m128i __A, __m128i __B)
  1281. {
  1282.   return (__m128i)__builtin_ia32_pand128 ((__v2di)__A, (__v2di)__B);
  1283. }
  1284.  
  1285. static __inline __m128i
  1286. _mm_andnot_si128 (__m128i __A, __m128i __B)
  1287. {
  1288.   return (__m128i)__builtin_ia32_pandn128 ((__v2di)__A, (__v2di)__B);
  1289. }
  1290.  
  1291. static __inline __m128i
  1292. _mm_or_si128 (__m128i __A, __m128i __B)
  1293. {
  1294.   return (__m128i)__builtin_ia32_por128 ((__v2di)__A, (__v2di)__B);
  1295. }
  1296.  
  1297. static __inline __m128i
  1298. _mm_xor_si128 (__m128i __A, __m128i __B)
  1299. {
  1300.   return (__m128i)__builtin_ia32_pxor128 ((__v2di)__A, (__v2di)__B);
  1301. }
  1302.  
  1303. static __inline __m128i
  1304. _mm_cmpeq_epi8 (__m128i __A, __m128i __B)
  1305. {
  1306.   return (__m128i)__builtin_ia32_pcmpeqb128 ((__v16qi)__A, (__v16qi)__B);
  1307. }
  1308.  
  1309. static __inline __m128i
  1310. _mm_cmpeq_epi16 (__m128i __A, __m128i __B)
  1311. {
  1312.   return (__m128i)__builtin_ia32_pcmpeqw128 ((__v8hi)__A, (__v8hi)__B);
  1313. }
  1314.  
  1315. static __inline __m128i
  1316. _mm_cmpeq_epi32 (__m128i __A, __m128i __B)
  1317. {
  1318.   return (__m128i)__builtin_ia32_pcmpeqd128 ((__v4si)__A, (__v4si)__B);
  1319. }
  1320.  
  1321. static __inline __m128i
  1322. _mm_cmplt_epi8 (__m128i __A, __m128i __B)
  1323. {
  1324.   return (__m128i)__builtin_ia32_pcmpgtb128 ((__v16qi)__B, (__v16qi)__A);
  1325. }
  1326.  
  1327. static __inline __m128i
  1328. _mm_cmplt_epi16 (__m128i __A, __m128i __B)
  1329. {
  1330.   return (__m128i)__builtin_ia32_pcmpgtw128 ((__v8hi)__B, (__v8hi)__A);
  1331. }
  1332.  
  1333. static __inline __m128i
  1334. _mm_cmplt_epi32 (__m128i __A, __m128i __B)
  1335. {
  1336.   return (__m128i)__builtin_ia32_pcmpgtd128 ((__v4si)__B, (__v4si)__A);
  1337. }
  1338.  
  1339. static __inline __m128i
  1340. _mm_cmpgt_epi8 (__m128i __A, __m128i __B)
  1341. {
  1342.   return (__m128i)__builtin_ia32_pcmpgtb128 ((__v16qi)__A, (__v16qi)__B);
  1343. }
  1344.  
  1345. static __inline __m128i
  1346. _mm_cmpgt_epi16 (__m128i __A, __m128i __B)
  1347. {
  1348.   return (__m128i)__builtin_ia32_pcmpgtw128 ((__v8hi)__A, (__v8hi)__B);
  1349. }
  1350.  
  1351. static __inline __m128i
  1352. _mm_cmpgt_epi32 (__m128i __A, __m128i __B)
  1353. {
  1354.   return (__m128i)__builtin_ia32_pcmpgtd128 ((__v4si)__A, (__v4si)__B);
  1355. }
  1356.  
  1357. #define _mm_extract_epi16(__A, __B) __builtin_ia32_pextrw128 ((__v8hi)__A, __B)
  1358.  
  1359. #define _mm_insert_epi16(__A, __B, __C) ((__m128i)__builtin_ia32_pinsrw128 ((__v8hi)__A, __B, __C))
  1360.  
  1361. static __inline __m128i
  1362. _mm_max_epi16 (__m128i __A, __m128i __B)
  1363. {
  1364.   return (__m128i)__builtin_ia32_pmaxsw128 ((__v8hi)__A, (__v8hi)__B);
  1365. }
  1366.  
  1367. static __inline __m128i
  1368. _mm_max_epu8 (__m128i __A, __m128i __B)
  1369. {
  1370.   return (__m128i)__builtin_ia32_pmaxub128 ((__v16qi)__A, (__v16qi)__B);
  1371. }
  1372.  
  1373. static __inline __m128i
  1374. _mm_min_epi16 (__m128i __A, __m128i __B)
  1375. {
  1376.   return (__m128i)__builtin_ia32_pminsw128 ((__v8hi)__A, (__v8hi)__B);
  1377. }
  1378.  
  1379. static __inline __m128i
  1380. _mm_min_epu8 (__m128i __A, __m128i __B)
  1381. {
  1382.   return (__m128i)__builtin_ia32_pminub128 ((__v16qi)__A, (__v16qi)__B);
  1383. }
  1384.  
  1385. static __inline int
  1386. _mm_movemask_epi8 (__m128i __A)
  1387. {
  1388.   return __builtin_ia32_pmovmskb128 ((__v16qi)__A);
  1389. }
  1390.  
  1391. static __inline __m128i
  1392. _mm_mulhi_epu16 (__m128i __A, __m128i __B)
  1393. {
  1394.   return (__m128i)__builtin_ia32_pmulhuw128 ((__v8hi)__A, (__v8hi)__B);
  1395. }
  1396.  
  1397. #define _mm_shufflehi_epi16(__A, __B) ((__m128i)__builtin_ia32_pshufhw ((__v8hi)__A, __B))
  1398. #define _mm_shufflelo_epi16(__A, __B) ((__m128i)__builtin_ia32_pshuflw ((__v8hi)__A, __B))
  1399. #define _mm_shuffle_epi32(__A, __B) ((__m128i)__builtin_ia32_pshufd ((__v4si)__A, __B))
  1400.  
  1401. static __inline void
  1402. _mm_maskmoveu_si128 (__m128i __A, __m128i __B, char *__C)
  1403. {
  1404.   __builtin_ia32_maskmovdqu ((__v16qi)__A, (__v16qi)__B, __C);
  1405. }
  1406.  
  1407. static __inline __m128i
  1408. _mm_avg_epu8 (__m128i __A, __m128i __B)
  1409. {
  1410.   return (__m128i)__builtin_ia32_pavgb128 ((__v16qi)__A, (__v16qi)__B);
  1411. }
  1412.  
  1413. static __inline __m128i
  1414. _mm_avg_epu16 (__m128i __A, __m128i __B)
  1415. {
  1416.   return (__m128i)__builtin_ia32_pavgw128 ((__v8hi)__A, (__v8hi)__B);
  1417. }
  1418.  
  1419. static __inline __m128i
  1420. _mm_sad_epu8 (__m128i __A, __m128i __B)
  1421. {
  1422.   return (__m128i)__builtin_ia32_psadbw128 ((__v16qi)__A, (__v16qi)__B);
  1423. }
  1424.  
  1425. static __inline void
  1426. _mm_stream_si32 (int *__A, int __B)
  1427. {
  1428.   __builtin_ia32_movnti (__A, __B);
  1429. }
  1430.  
  1431. static __inline void
  1432. _mm_stream_si128 (__m128i *__A, __m128i __B)
  1433. {
  1434.   __builtin_ia32_movntdq ((__v2di *)__A, (__v2di)__B);
  1435. }
  1436.  
  1437. static __inline void
  1438. _mm_stream_pd (double *__A, __m128d __B)
  1439. {
  1440.   __builtin_ia32_movntpd (__A, (__v2df)__B);
  1441. }
  1442.  
  1443. static __inline __m128i
  1444. _mm_movpi64_epi64 (__m64 __A)
  1445. {
  1446.   return (__m128i)__builtin_ia32_movq2dq ((unsigned long long)__A);
  1447. }
  1448.  
  1449. static __inline void
  1450. _mm_clflush (void const *__A)
  1451. {
  1452.   return __builtin_ia32_clflush (__A);
  1453. }
  1454.  
  1455. static __inline void
  1456. _mm_lfence (void)
  1457. {
  1458.   __builtin_ia32_lfence ();
  1459. }
  1460.  
  1461. static __inline void
  1462. _mm_mfence (void)
  1463. {
  1464.   __builtin_ia32_mfence ();
  1465. }
  1466.  
  1467. static __inline __m128i
  1468. _mm_cvtsi32_si128 (int __A)
  1469. {
  1470.   return (__m128i) __builtin_ia32_loadd (&__A);
  1471. }
  1472.  
  1473. #ifdef __x86_64__
  1474. static __inline __m128i
  1475. _mm_cvtsi64x_si128 (long long __A)
  1476. {
  1477.   return (__m128i) __builtin_ia32_movq2dq (__A);
  1478. }
  1479. #endif
  1480.  
  1481. static __inline int
  1482. _mm_cvtsi128_si32 (__m128i __A)
  1483. {
  1484.   int __tmp;
  1485.   __builtin_ia32_stored (&__tmp, (__v4si)__A);
  1486.   return __tmp;
  1487. }
  1488.  
  1489. #ifdef __x86_64__
  1490. static __inline long long
  1491. _mm_cvtsi128_si64x (__m128i __A)
  1492. {
  1493.   return __builtin_ia32_movdq2q ((__v2di)__A);
  1494. }
  1495. #endif
  1496.  
  1497. #endif /* __SSE2__  */
  1498.  
  1499. #endif /* _EMMINTRIN_H_INCLUDED */
  1500.